X-Git-Url: http://git.cyclocoop.org//%22http:/%22.attribut_html%28%24lesurls%5B%24numero%5D%29.%22/%22?a=blobdiff_plain;f=includes%2Fapi%2FApiQueryImageInfo.php;h=b8f0890c77e6aa258f453b0379fd6325a92cacd0;hb=542cbb8b400d79d576e7871b25c16b1247771270;hp=4b49a80a239b3c32aaa79430c7f5ee0768bd846c;hpb=d65e736864d17ecc84385a26295e5859de2f9fee;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php index 4b49a80a23..b8f0890c77 100644 --- a/includes/api/ApiQueryImageInfo.php +++ b/includes/api/ApiQueryImageInfo.php @@ -237,9 +237,11 @@ class ApiQueryImageInfo extends ApiQueryBase { $scale = array(); $scale['height'] = $params['urlheight']; } else { - $scale = null; if ( $params['urlparam'] ) { - $this->dieUsage( "{$p}urlparam requires {$p}urlwidth", "urlparam_no_width" ); + // Audio files might not have a width/height. + $scale = array(); + } else { + $scale = null; } } @@ -256,6 +258,10 @@ class ApiQueryImageInfo extends ApiQueryBase { * @return array Array of parameters for transform. */ protected function mergeThumbParams( $image, $thumbParams, $otherParams ) { + if ( $thumbParams === null ) { + // No scaling requested + return null; + } if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) { // We want to limit only by height in this situation, so pass the // image's full width as the limiting width. But some file types @@ -269,6 +275,7 @@ class ApiQueryImageInfo extends ApiQueryBase { } if ( !$otherParams ) { + $this->checkParameterNormalise( $image, $thumbParams ); return $thumbParams; } $p = $this->getModulePrefix(); @@ -289,11 +296,11 @@ class ApiQueryImageInfo extends ApiQueryBase { // handlers. $this->setWarning( "Could not parse {$p}urlparam for " . $image->getName() . '. Using only width and height' ); - + $this->checkParameterNormalise( $image, $thumbParams ); return $thumbParams; } - if ( isset( $paramList['width'] ) ) { + if ( isset( $paramList['width'] ) && isset( $thumbParams['width'] ) ) { if ( intval( $paramList['width'] ) != intval( $thumbParams['width'] ) ) { $this->setWarning( "Ignoring width value set in {$p}urlparam ({$paramList['width']}) " . "in favor of width value derived from {$p}urlwidth/{$p}urlheight " @@ -307,7 +314,33 @@ class ApiQueryImageInfo extends ApiQueryBase { } } - return $thumbParams + $paramList; + $finalParams = $thumbParams + $paramList; + $this->checkParameterNormalise( $image, $finalParams ); + return $finalParams; + } + + /** + * Verify that the final image parameters can be normalised. + * + * This doesn't use the normalised parameters, since $file->transform + * expects the pre-normalised parameters, but doing the normalisation + * allows us to catch certain error conditions early (such as missing + * required parameter). + * + * @param $image File + * @param $finalParams array List of parameters to transform image with + */ + protected function checkParameterNormalise( $image, $finalParams ) { + $h = $image->getHandler(); + if ( !$h ) { + return; + } + // Note: normaliseParams modifies the array in place, but we aren't interested + // in the actual normalised version, only if we can actually normalise them, + // so we use the functions scope to throw away the normalisations. + if ( !$h->normaliseParams( $image, $finalParams ) ) { + $this->dieUsage( "Could not normalise image parameters for " . $image->getName(), "urlparamnormal" ); + } } /** @@ -534,7 +567,7 @@ class ApiQueryImageInfo extends ApiQueryBase { * * If this is >= TRANSFORM_LIMIT, you should probably stop processing images. * - * @return int count + * @return int Count */ static function getTransformCount() { return self::$transformCount; @@ -716,8 +749,10 @@ class ApiQueryImageInfo extends ApiQueryBase { 'no more than ' . self::TRANSFORM_LIMIT . ' scaled images will be returned.' ), 'urlheight' => "Similar to {$p}urlwidth.", - 'urlparam' => array( "A handler specific parameter string. For example, pdf's ", - "might use 'page15-100px'. {$p}urlwidth must be used and be consistent with {$p}urlparam" ), + 'urlparam' => array( + "A handler specific parameter string. For example, pdf's ", + "might use 'page15-100px'." + ), 'limit' => 'How many image revisions to return per image', 'start' => 'Timestamp to start listing from', 'end' => 'Timestamp to stop listing at', @@ -739,151 +774,10 @@ class ApiQueryImageInfo extends ApiQueryBase { ); } - public static function getResultPropertiesFiltered( $filter = array() ) { - $props = array( - 'timestamp' => array( - 'timestamp' => 'timestamp' - ), - 'user' => array( - 'userhidden' => 'boolean', - 'user' => 'string', - 'anon' => 'boolean' - ), - 'userid' => array( - 'userhidden' => 'boolean', - 'userid' => 'integer', - 'anon' => 'boolean' - ), - 'size' => array( - 'size' => 'integer', - 'width' => 'integer', - 'height' => 'integer', - 'pagecount' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'dimensions' => array( - 'size' => 'integer', - 'width' => 'integer', - 'height' => 'integer', - 'pagecount' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - 'comment' => array( - 'commenthidden' => 'boolean', - 'comment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'parsedcomment' => array( - 'commenthidden' => 'boolean', - 'parsedcomment' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'canonicaltitle' => array( - 'canonicaltitle' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'url' => array( - 'filehidden' => 'boolean', - 'thumburl' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'thumbwidth' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'thumbheight' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ), - 'thumberror' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'url' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ), - 'descriptionurl' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'sha1' => array( - 'filehidden' => 'boolean', - 'sha1' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'mime' => array( - 'filehidden' => 'boolean', - 'mime' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'thumbmime' => array( - 'filehidden' => 'boolean', - 'thumbmime' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'mediatype' => array( - 'filehidden' => 'boolean', - 'mediatype' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'archivename' => array( - 'filehidden' => 'boolean', - 'archivename' => array( - ApiBase::PROP_TYPE => 'string', - ApiBase::PROP_NULLABLE => true - ) - ), - 'bitdepth' => array( - 'filehidden' => 'boolean', - 'bitdepth' => array( - ApiBase::PROP_TYPE => 'integer', - ApiBase::PROP_NULLABLE => true - ) - ), - ); - - return array_diff_key( $props, array_flip( $filter ) ); - } - - public function getResultProperties() { - return self::getResultPropertiesFiltered(); - } - public function getDescription() { return 'Returns image information and upload history.'; } - public function getPossibleErrors() { - $p = $this->getModulePrefix(); - - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => "{$p}urlwidth", 'info' => "{$p}urlheight cannot be used without {$p}urlwidth" ), - array( 'code' => 'urlparam', 'info' => "Invalid value for {$p}urlparam" ), - array( 'code' => 'urlparam_no_width', 'info' => "{$p}urlparam requires {$p}urlwidth" ), - ) ); - } - public function getExamples() { return array( 'api.php?action=query&titles=File:Albert%20Einstein%20Head.jpg&prop=imageinfo',